package com.ant.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

/**
 * Swagger API文档配置类
 * 
 * 配置OpenAPI 3.0规范的API文档
 * 提供API接口的自动文档生成功能
 * 支持JWT认证配置，便于接口测试
 * 
 * @Auther: 灏
 * @Date: 2025/5/25 - 05 - 25 - 20:05
 * @Description: com.ant.comm.config.swagger
 * @version: 1.0
 */
@Configuration
public class SwaggerConfig implements EnvironmentAware {
    
    /** 环境配置对象，用于获取配置文件中的属性值 */
    private static Environment environment;

    /**
     * 设置环境配置
     * 
     * 实现EnvironmentAware接口，Spring会自动注入Environment对象
     * 
     * @param environment 环境配置对象
     */
    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    /**
     * 获取环境配置对象
     * 
     * @return 环境配置对象
     */
    public static Environment getEnvironment() {
        return environment;
    }

    /**
     * 配置OpenAPI文档
     * 
     * 创建OpenAPI 3.0规范的API文档配置
     * 包含项目信息、联系信息、许可证信息
     * 配置JWT认证方案，支持Bearer Token认证
     * 
     * @return OpenAPI配置对象
     */
    @Bean
    public OpenAPI customOpenAPI() {
        // 配置联系信息
        Contact contact = new Contact()
                .name(environment.getProperty("knife4j.contact.name", "灏"))
                .url(environment.getProperty("knife4j.contact.url", ""))
                .email(environment.getProperty("knife4j.contact.email", ""));

        return new OpenAPI()
                // 配置API文档基本信息
                .info(new Info()
                        .title(environment.getProperty("spring.application.name", "ant") + "项目API")
                        .description(environment.getProperty("knife4j.description", "ant工具后端"))
                        .version(environment.getProperty("knife4j.version", "v1.0.0"))
                        .contact(contact)
                        .termsOfService(environment.getProperty("knife4j.url", ""))
                        .license(new License().name("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0")))
                // 配置安全认证方案
                .components(new Components()
                        .addSecuritySchemes("bearer-jwt", new SecurityScheme()
                                .type(SecurityScheme.Type.HTTP)           // HTTP认证类型
                                .scheme("bearer")                         // Bearer认证方案
                                .bearerFormat("JWT")                      // JWT格式
                                .in(SecurityScheme.In.HEADER)             // 在请求头中传递
                                .name("Authorization")                    // 认证头名称
                                .description("JWT认证token")))            // 认证说明
                // 为所有API添加JWT认证要求
                .addSecurityItem(new SecurityRequirement().addList("bearer-jwt"));
    }
}
